package main

import (
	"flag"
	log "code.google.com/p/log4go"
	"EasyData/global"
	"EasyData/sqls"
	"EasyData/task"
	"os"
	"os/signal"
	"syscall"
	"EasyData/zkclient"
	"EasyData/hbase"
	"EasyData/zkclient/basic"
	"runtime"
)

const(
	DefaultConfigPath ="config/config.json"
	DefaultLogPath = "config/log4go.xml"
)
/**
	充分利用服务器线程跑任务
 */
func init(){
	runtime.GOMAXPROCS(runtime.NumCPU()*2)
}
func main() {
	cfg := flag.String("config", DefaultConfigPath, "configuration file")
	flag.Parse()
	log.LoadConfiguration(DefaultLogPath)
	//初始化配置信息
	global.ParseConfig(*cfg)
	//sql语义解析排错
	err := sqls.ParseSql()
	global.PanicError(err,nil)
	//配置问题排查，自相矛盾的配置，提醒错误
	err = global.CheckCondigErr()
	global.PanicError(err,nil)

	log.Info("application namespace：[%s]",global.Config().Namespace)

	//如果有配置Zookeeper，则表示当前的JOB需要启动分布式治理能力，则连接zk
	if ""!= global.Config().Zookeeper {
		log.Info("init zk config task ip[%s]",global.Config().Zookeeper)
		zkclient.InitZkTask()
	}
	//启动任务
	for v:=range global.Config().Tasks{
		if global.Config().Tasks[v].IsUse {
			go task.RunTask(global.Config().Tasks[v])
		}
	}
	//接收程序关闭信息
	sigs := make(chan os.Signal, 1)
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-sigs
		log.Info("EasyData Exit by kill")

		//释放资源
		hbase.GetHbaseClient().Close()
		//zookeeper连接
		if ""!= global.Config().Zookeeper{
			basic.GetZkClient().Close()
		}
		//mysql数据库连接
		for i:= range task.QueueManager.TaskQueue {
			task.QueueManager.TaskQueue[i].DB.Close()
		}
		os.Exit(0)
	}()
	<-sigs
	//在主进程阻塞
	select {}

}